概述

本文对DDL IO性能优化进行了整体介绍。

PolarDB是计算与存储分离的技术架构,计算节点通过高性能RDMA访问分布式存储,但分布式存储的访问延迟依然明显高于本地盘的访问延迟。在大表DDL场景中,DDL操作会触发大量的IO操作,因此分布式存储的额外延迟对DDL会有一定的性能影响。针对这类问题,PolarDB在DDL IO路径上主要实现了以下功能:

  • DDL预读:DDL在构建索引过程中开启预读线程,减少IO读延迟。

  • DDL异步IO:DDL在写入数据时开启后台写线程,减少IO写延迟;

  • DDL多路归并排序:减少DDL过程中的IO次数,降低IO延迟的影响。

性能测试

  • 测试环境

    • 一个规格为8核32 GB的PolarDB MySQL版8.0版本的集群。

    • 集群存储空间为50 TB。

  • 测试表结构

    通过如下语句创建一张名为table_1的表:

    CREATE TABLE `table_1` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `seller_id` bigint(20) DEFAULT NULL,
    `seller_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
    `gmt_create` varchar(30) DEFAULT NULL,
    `update_time` varchar(30) DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB;
  • 测试表数据

    通过如下语句生成测试数据:

    delimiter ||
    CREATE PROCEDURE populate_0(IN NUM INT)
    BEGIN
    DECLARE sid INT;
    DECLARE suffix_name INT;
    DECLARE i INT;
    SET sid=1000;
    SET suffix_name=10;
    SET i=1;
    START TRANSACTION;
    WHILE i <= NUM
    DO
    INSERT INTO table_1(seller_id,seller_name,gmt_create,update_time) VALUES(sid,CONCAT('sellername',suffix_name),NOW(),NOW());
    SET suffix_name=suffix_name+1;
    SET sid=sid+1;
    SET i=i+1;
    END WHILE;
    COMMIT;
    END ||
    delimiter ;
    CALL populate_0(100000000) ;
  • 测试方法及结果

    数据插入完成以后,通过执行alter table table_1 add index name_index (seller_name);来进行DDL执行效率的对比:

    DDL预读、异步IO、多路归并排序功能开启情况

    耗时(秒)

    开启DDL预读、异步IO、多路归并排序功能:

    • loose_innodb_polar_ddl_build_index_readahead=ON

    • loose_innodb_polar_ddl_build_index_readahead_page_num=256

    • innodb_polar_ddl_async_io=ON

    • innodb_polar_parallel_merge_ways=8

    252

    关闭DDL预读、异步IO、多路归并排序功能:

    • loose_innodb_polar_ddl_build_index_readahead=OFF

    • loose_innodb_polar_ddl_build_index_readahead_page_num=64

    • innodb_polar_ddl_async_io=OFF

    • innodb_polar_parallel_merge_ways=2

    485